const fs = require('fs');

// node-api
// fs.readFile('path', () => {})
// fs.writeFile('path', JSON.stringify(data) , (err, data) => {})
// fs.readDir('path', (err, data) => {})

// 回调地狱 函数嵌套
// fs.readFile('./data/file1.json', (err, data) => {
//   let path1 = JSON.parse(data.toString()).filename
//   fs.readFile(path1, (err, data) => {
//     let path2 = JSON.parse(data.toString()).filename
//     fs.readFile(path2, (err, data) => {
//       // console.log(JSON.parse(data.toString()).done)
//     })
//   })
// })

// 封装异步api
function myReadFile(path) {
  return new Promise((resolve, reject) => {
    fs.readFile(path, (err, data) => {
      if (err) reject(err)
      resolve(JSON.parse(data.toString()))
    })
  })
}

// 用了一种方式：链式调用  $('div').sleep().css().click(() => {})
// 链式调用式如何实现的？ 在每一个函数的最下方都加一个return this;(注意：这个函数一定是执行函数，不能是需要获取结果的函数)
// myReadFile('./data/file1.json')
//   .then(res => {
//     return myReadFile(res.filename)
//   })
//   .then(res => {
//     return myReadFile(res.filename)
//   })
//   .then(res => {
//     console.log(res, 'res')
//   })
// promise 解决回调函数的回调地狱问题


// function* myGeneratorFn(path) {
//   let data = yield myReadFile(path).then(res => {
//     console.log(res, 'res')
//   })
//   // console.log(data, 'data')
//   return data;
// }

// let result = myGeneratorFn('./data/file1.json').next()
// console.log(result, 'result')



// async function myAsyncFn(path) {
//   let data = await myReadFile(path)
//   // console.log(data, 'data')
//   return data;
// }

// let it = myAsyncFn('./data/file1.json')
// .then(res => {
//   console.log(res, 'res')
// })
// console.log(it, 'it')

// `案例： 如果想在函数中 三秒之后获取到一个结果，如何实现？`

function getData(fn) {
  setTimeout(() => {
    // return "我是异步结果"
    fn && fn("我是异步结果")
  }, 3000)
}

getData((res) => {
  console.log(res, 'res')
})

// console.log(getData())

/**
 *
 * 1. return只能获取同步结果（return是一个立即执行的过程）
 * 2. 定时器不是立即执行的，所以，在定时器中，return是不能获取到结果的；
 *
 *
 * 1. redux的reducer中能否执行异步代码？
 * 2. reducer是一个纯函数 return
 *
 * 1. 如何在reducer中使用异步代码
 *
*/
